SqlServer 内存篇(三) |
您所在的位置:网站首页 › sql server数据库使用的数据模型是 › SqlServer 内存篇(三) |
既然sqlserver内存有那么多种,每种都可能有各自上限值,DBA也必须能够看到sqlserver每种内存到底使用了多少,究竟是哪一种接近了上限、是哪部分内存不足,才能更好地解决问题。 通常可以用两种方法看到各部分内存用量——内存相关计数器和DMV视图 一、 内存相关计数器 与sqlserver相关的计数器通常以SQLServer:或MSSQL&开头,与内存相关的主要如下: 1. SQLServer:Memory Manager 总体内存使用情况 Total Server Memory(KB):sqlserver buffer pool当前大小Target Server Memory(KB):SqlServer理论上能使用的最大内存数,min(AWE,"Max Server Memory",当前服务器可用内存数) ![]() 下面是sqlserver各部分内存使用情况: Optimizer Memory(KB):正在用于查询优化的状态内存数SQL Cache Memory(KB):正在用于动态sqlserver高速缓存的内存数Lock Memory(KB):用于锁的内存总量Connection Memory(KB):正在用于维护连接的内存数Granted Workspace Memory(KB):正在用于哈希、排序、索引创建等操作的内存数Memory Grants Pending:等待工作空间内存授权的进程总数,大于0说明用户内存由于内存压力而被延迟。一般来说,意味着有较严重的内存瓶颈2. SQLServer:Buffer Manager 数据页读写情况 buffer pool是sqlserver内存使用最多也最容易出现瓶颈的部分,因此这部分计数器非常重要。 二、 动态性能视图DMV sqlserver使用Memory Clerk方式统一管理内存分配和回收,而跟踪内存使用最常用的视图也就叫做。 1. sqlserver各部分内存使用情况 —— sys.dm_os_memory_clerks select type , sum(virtual_memory_reserved_kb) VM_Reserved , sum(virtual_memory_committed_kb) VM_Commited , sum(awe_allocated_kb) AWE_Allocated , sum(shared_memory_reserved_kb) Shared_Reserved , sum(shared_memory_committed_kb) Shared_Commited --, sum(single_pages_kb) --SQL2005、2008 --, sum(multi_pages_kb) --SQL2005、2008 from sys.dm_os_memory_clerks group by type order by type; 字段含义如下: type:Memory Clerk名称,根据名称可以大概知道用途virtual_memory_reserved_kb:该Clerk reserve的虚拟内存量virtual_memory_committed_kb:该Clerk commit的虚拟内存量,提交的内存应始终小于保留的内存awe_allocated_kb:该Clerk 使用AWE分配的内存量,主要用于2005、2008版本shared_memory_reserved_kb:该Clerk reserve以供共享内存及文件映射使用的内存量shared_memory_committed_kb:该Clerk commit以供共享内存及文件映射使用的内存量,这两个字段可以追踪shared memory的大小single_pages_kb:通过stolen分配的单页内存量,主要用于2005、2008版本multi_pages_kb:分配的多页内存量,主要用于2005、2008版本
主要type如下: 数据页面缓存2. sqlserver缓存了哪些对象 —— sys.dm_os_buffer_descriptors Buffer Pool的内存主要是由那个数据库占了 SELECT count(*)*8 as cached_pages_kb,CASE database_id WHEN 32767 THEN 'ResourceDb' ELSE db_name(database_id) END AS Database_name FROM sys.dm_os_buffer_descriptors GROUP BY db_name(database_id) ,database_id ORDER BY cached_pages_kb DESC;当前数据库的哪个表或者索引占用Pool缓冲空间最多 SELECT count(*)*8 AS cached_pages_kb,obj.name ,obj.index_id,b.type_desc,b.name FROM sys.dm_os_buffer_descriptors AS bd INNER JOIN ( SELECT object_name(object_id) AS name ,index_id ,allocation_unit_id,object_id FROM sys.allocation_units AS au INNER JOIN sys.partitions AS p ON au.container_id = p.hobt_id AND (au.type = 1 OR au.type = 3) UNION ALL SELECT object_name(object_id) AS name ,index_id, allocation_unit_id,object_id FROM sys.allocation_units AS au INNER JOIN sys.partitions AS p ON au.container_id = p.partition_id AND au.type = 2 ) AS obj ON bd.allocation_unit_id = obj.allocation_unit_id LEFT JOIN sys.indexes b on b.object_id = obj.object_id AND b.index_id =obj.index_id WHERE database_id = db_id() GROUP BY obj.name, obj.index_id ,b.name,b.type_desc ORDER BY cached_pages_kb DESC;Buffer Pool里面修改过的页总数大小 SELECT count(*)*8 as cached_pages_kb, convert(varchar(5),convert(decimal(5,2),(100-1.0*(select count(*) from sys.dm_os_buffer_descriptors b where b.database_id=a.database_id andis_modified=0)/count(*)*100.0)))+'%' modified_percentage ,CASE database_id WHEN 32767 THEN 'ResourceDb' ELSE db_name(database_id) END AS Database_name FROM sys.dm_os_buffer_descriptors a GROUP BY db_name(database_id) ,database_id ORDER BY cached_pages_kb DESC;
3. 执行计划都缓存了什么 —— sys.dm_exec_cached_plans 查询结果会很大,注意将结果集输出到表或文件中,直接输出到DB服务器的SMSS可能导致资源争用 -- 查询缓存中具体的执行计划,及对应的SQL -- 将此结果按照数据表或SQL进行统计,可以作为基线,调整索引时考虑 SELECT usecounts , refcounts , size_in_bytes , cacheobjtype , objtype , TEXT FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) ORDER BY objtype DESC ; |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |